/**
 * 网络请求封装模块
 * 支持请求缓存功能
 */

import cache from './cache.js';
import { TextEncoder, TextDecoder } from 'text-decoding'
/**
 * 生成缓存key
 * @param {String} url - 请求URL
 * @param {Object} data - 请求参数
 * @returns {String} 缓存key
 */
function generateCacheKey(url, data) {
	return `request_${url}_${JSON.stringify(data || {})}`;
}

/**
 * 将ArrayBuffer解码为字符串
 * App平台使用原生API，小程序平台使用encoding.js
 * @param {ArrayBuffer} buffer - 原始二进制数据
 * @param {String} charset - 字符编码，如'utf-8'、'gbk'、'gb2312'等
 * @returns {String} 解码后的字符串
 */
function decodeArrayBuffer(buffer, charset = 'utf-8') {
	try {
		const uint8Array = new Uint8Array(buffer);
		
		// 将charset标准化
		const normalizedCharset = charset.toLowerCase().replace(/[_-]/g, '');
		console.info('normalizedCharset',normalizedCharset)
		// 对于GBK编码，使用plus.android原生解码
		if (normalizedCharset == 'gbk' || normalizedCharset == 'gb2312') {
			console.info('is gbk')
			// Android平台使用原生String构造函数
			const decodedData = new TextDecoder('gb18030').decode(uint8Array);
			console.info("解析gbk：",decodedData)
			return decodedData;
		}
		
		// UTF-8编码或GBK解码失败时的降级处理
		let result = '';
		for (let i = 0; i < uint8Array.length; i++) {
			result += String.fromCharCode(uint8Array[i]);
		}
		console.info("使用默认编码：",result)
		try {
			return decodeURIComponent(escape(result));
		} catch (e) {
			return result;
		}
	} catch (e) {
		console.error(`App平台解码失败 (${charset}):`, e);
		throw new Error('数据解码失败');
	}
}

/**
 * 发送GET请求
 * @param {Object} options - 请求配置
 * @param {String} options.url - 请求URL
 * @param {Object} options.data - 请求参数
 * @param {Boolean} options.useCache - 是否使用缓存，默认true
 * @param {Number} options.cacheTime - 缓存时间（毫秒），默认30分钟
 * @returns {Promise} 返回Promise对象
 */
function get(options) {
	const {
		url,
		data = {},
		useCache = true,
		cacheTime = 30 * 60 * 1000 // 默认30分钟
	} = options;

	// 检查缓存
	if (useCache) {
		const cacheKey = generateCacheKey(url, data);
		const cachedData = cache.get(cacheKey);
		if (cachedData) {
			console.log('使用缓存数据:', cacheKey);
			return Promise.resolve(cachedData);
		}
	}

	// 发起请求
	return new Promise((resolve, reject) => {
		uni.request({
			url,
			data,
			method: 'GET',
			// 获取原始二进制数据，以便手动解码
			responseType: 'arraybuffer',
			success: (res) => {
				if (res.statusCode === 200) {
					// 获取响应头中的charset
					let charset = 'utf-8';
					const contentType = res.header['Content-Type'] || res.header['content-type'];
					if (contentType) {
						const charsetMatch = contentType.match(/charset=([^;]+)/i);
						if (charsetMatch) {
							charset = charsetMatch[1].trim().toLowerCase();
						}
					}
					
					console.log('检测到charset:', charset);
					
					// 根据charset解码ArrayBuffer数据
					let responseData;
					try {
						responseData = decodeArrayBuffer(res.data, charset);
					} catch (e) {
						console.error('解码失败:', e);
						reject({
							code: -1,
							msg: '数据解码失败: ' + e.message
						});
						return;
					}
					
					// 保存到缓存
					if (useCache) {
						const cacheKey = generateCacheKey(url, data);
						cache.set(cacheKey, responseData, cacheTime);
					}
					resolve(responseData);
				} else {
					reject({
						code: res.statusCode,
						msg: '请求失败'
					});
				}
			},
			fail: (err) => {
				reject({
					code: -1,
					msg: err.errMsg || '网络请求失败'
				});
			}
		});
	});
}

/**
 * 发送POST请求
 * @param {Object} options - 请求配置
 * @param {String} options.url - 请求URL
 * @param {Object} options.data - 请求参数
 * @returns {Promise} 返回Promise对象
 */
function post(options) {
	const { url, data = {} } = options;

	return new Promise((resolve, reject) => {
		uni.request({
			url,
			data,
			method: 'POST',
			success: (res) => {
				if (res.statusCode === 200) {
					resolve(res.data);
				} else {
					reject({
						code: res.statusCode,
						msg: '请求失败'
					});
				}
			},
			fail: (err) => {
				reject({
					code: -1,
					msg: err.errMsg || '网络请求失败'
				});
			}
		});
	});
}

/**
 * 清除指定URL的缓存
 * @param {String} url - 请求URL
 * @param {Object} data - 请求参数
 */
function clearCache(url, data) {
	const cacheKey = generateCacheKey(url, data);
	cache.remove(cacheKey);
}

/**
 * 清除所有请求缓存
 */
function clearAllCache() {
	cache.clear();
}

export default {
	get,
	post,
	clearCache,
	clearAllCache
};

